//+------------------------------------------------------------------+
//|                                                       WndObj.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include "Wnd.h"                      // 基础控件基类（提供控件核心能力）

//+------------------------------------------------------------------+
//| CWndObj 类：MQL5 图表对象控件基类                                 |
//| 核心能力：继承自 CWnd，扩展图表对象（如文本、按钮、图形等）的属性管理， |
//|           支持设置文本、颜色、字体等样式，处理对象创建/修改/删除/拖拽事件 |
//| 适用场景：作为所有基于图表对象的可视化控件父类（如标签、按钮、形状等）， |
//|           提供统一的样式管理和事件处理框架                           |
//+------------------------------------------------------------------+
class CWndObj : public CWnd
  {
private:
   // 对象操作限制标志（私有，仅内部使用）
   bool              m_undeletable;         // 不可删除标志：true=禁止删除对象，false=允许删除
   bool              m_unchangeable;        // 不可修改标志：true=禁止修改对象属性，false=允许修改
   bool              m_unmoveable;          // 不可移动标志：true=禁止拖拽移动对象，false=允许移动

protected:
   // 图表对象样式属性（保护，子类可直接访问）
   string            m_text;                // 对象文本内容（如标签文字、按钮标题）
   color             m_color;               // 主颜色（如文本颜色、线条颜色）
   color             m_color_background;    // 背景颜色（如按钮背景、文本框背景）
   color             m_color_border;        // 边框颜色（如控件边框、形状轮廓）
   string            m_font;                // 字体名称（如 "Arial"）
   int               m_font_size;           // 字体大小（像素）
   long              m_zorder;              // Z轴顺序（控制控件叠放层级，值越大越靠上）

public:
   //----------------------------------------------------------------
   // 构造与析构函数
   //----------------------------------------------------------------
   /**
    * @brief 构造函数：初始化图表对象控件
    * @details 初始化样式属性默认值（字体、大小、颜色等），设置默认操作限制（不可删除/修改/移动）
    */
                     CWndObj(void);

   /**
    * @brief 析构函数：清理图表对象资源
    * @details 依赖父类及 OnDestroy() 释放图表对象
    */
                    ~CWndObj(void);

   //----------------------------------------------------------------
   // 事件处理：处理图表对象相关事件
   //----------------------------------------------------------------
   /**
    * @brief 处理图表事件（聚焦于对象相关事件）
    * @param id [in] 事件ID（如 CHARTEVENT_OBJECT_CREATE 表示对象创建）
    * @param lparam [in] 长整数参数（事件相关数据）
    * @param dparam [in] 双精度参数（事件相关数据）
    * @param sparam [in] 字符串参数（通常为对象名称，用于匹配当前控件）
    * @return bool - 处理结果：true=事件已处理（当前对象相关事件），false=未处理
    * @note 仅处理与当前控件名称匹配的对象事件（创建/修改/删除/拖拽）
    */
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);

   //----------------------------------------------------------------
   // 样式属性设置与获取：文本、颜色、字体等
   //----------------------------------------------------------------
   /**
    * @brief 获取对象文本内容
    * @return string - 当前文本（m_text）
    */
   string            Text(void) const;

   /**
    * @brief 设置对象文本内容
    * @param value [in] 新文本内容
    * @return bool - 设置结果：true=成功（触发 OnSetText() 应用变更），false=失败
    */
   bool              Text(const string value);

   /**
    * @brief 获取主颜色
    * @return color - 当前主颜色（m_color）
    */
   color             Color(void) const;

   /**
    * @brief 设置主颜色
    * @param value [in] 新主颜色（RGB值）
    * @return bool - 设置结果：true=成功（触发 OnSetColor() 应用变更），false=失败
    */
   bool              Color(const color value);

   /**
    * @brief 获取背景颜色
    * @return color - 当前背景颜色（m_color_background）
    */
   color             ColorBackground(void) const;

   /**
    * @brief 设置背景颜色
    * @param value [in] 新背景颜色（RGB值）
    * @return bool - 设置结果：true=成功（触发 OnSetColorBackground() 应用变更），false=失败
    */
   bool              ColorBackground(const color value);

   /**
    * @brief 获取边框颜色
    * @return color - 当前边框颜色（m_color_border）
    */
   color             ColorBorder(void) const;

   /**
    * @brief 设置边框颜色
    * @param value [in] 新边框颜色（RGB值）
    * @return bool - 设置结果：true=成功（触发 OnSetColorBorder() 应用变更），false=失败
    */
   bool              ColorBorder(const color value);

   /**
    * @brief 获取字体名称
    * @return string - 当前字体名称（m_font）
    */
   string            Font(void) const;

   /**
    * @brief 设置字体名称
    * @param value [in] 新字体名称（如 "Arial"、"SimHei"）
    * @return bool - 设置结果：true=成功（触发 OnSetFont() 应用变更），false=失败
    */
   bool              Font(const string value);

   /**
    * @brief 获取字体大小
    * @return int - 当前字体大小（像素，m_font_size）
    */
   int               FontSize(void) const;

   /**
    * @brief 设置字体大小
    * @param value [in] 新字体大小（像素，需>0）
    * @return bool - 设置结果：true=成功（触发 OnSetFontSize() 应用变更），false=失败
    */
   bool              FontSize(const int value);

   /**
    * @brief 获取Z轴顺序（叠放层级）
    * @return long - 当前Z轴顺序值（m_zorder）
    */
   long              ZOrder(void) const;

   /**
    * @brief 设置Z轴顺序（叠放层级）
    * @param value [in] 新Z轴顺序值（值越大越靠上）
    * @return bool - 设置结果：true=成功（触发 OnSetZOrder() 应用变更），false=失败
    */
   bool              ZOrder(const long value);

protected:
   //----------------------------------------------------------------
   // 对象事件回调：子类可重写以处理对象生命周期事件
   //----------------------------------------------------------------
   /**
    * @brief 对象创建事件回调
    * @return bool - 处理结果：true=成功（子类可扩展初始化逻辑），false=失败（默认 true）
    */
   virtual bool      OnObjectCreate(void);

   /**
    * @brief 对象修改事件回调
    * @return bool - 处理结果：true=成功（若不可修改则自动恢复属性），false=失败
    * @note 若 m_unchangeable 为 true，会自动调用 OnMove()、OnResize()、OnChange() 恢复属性
    */
   virtual bool      OnObjectChange(void);

   /**
    * @brief 对象删除事件回调
    * @return bool - 处理结果：true=成功（若不可删除则自动重建对象），false=失败
    * @note 若 m_undeletable 为 true，会自动调用 OnCreate() 重建对象并恢复属性
    */
   virtual bool      OnObjectDelete(void);

   /**
    * @brief 对象拖拽事件回调
    * @return bool - 处理结果：true=成功（若不可移动则自动恢复位置），false=失败
    * @note 若 m_unmoveable 为 true，会自动调用 OnMove() 恢复原始位置
    */
   virtual bool      OnObjectDrag(void);

   //----------------------------------------------------------------
   // 样式变更回调：子类可重写以应用样式到实际图表对象
   //----------------------------------------------------------------
   /**
    * @brief 文本变更回调（应用文本到图表对象）
    * @return bool - 应用结果：true=成功，false=失败（默认 true，需子类实现具体逻辑）
    */
   virtual bool      OnSetText(void);

   /**
    * @brief 主颜色变更回调（应用颜色到图表对象）
    * @return bool - 应用结果：true=成功，false=失败（默认 true，需子类实现具体逻辑）
    */
   virtual bool      OnSetColor(void);

   /**
    * @brief 背景颜色变更回调（应用背景色到图表对象）
    * @return bool - 应用结果：true=成功，false=失败（默认 true，需子类实现具体逻辑）
    */
   virtual bool      OnSetColorBackground(void);

   /**
    * @brief 边框颜色变更回调（应用边框色到图表对象）
    * @return bool - 应用结果：true=成功，false=失败（默认 true，需子类实现具体逻辑）
    */
   virtual bool      OnSetColorBorder(void);

   /**
    * @brief 字体变更回调（应用字体到图表对象）
    * @return bool - 应用结果：true=成功，false=失败（默认 true，需子类实现具体逻辑）
    */
   virtual bool      OnSetFont(void);

   /**
    * @brief 字体大小变更回调（应用字体大小到图表对象）
    * @return bool - 应用结果：true=成功，false=失败（默认 true，需子类实现具体逻辑）
    */
   virtual bool      OnSetFontSize(void);

   /**
    * @brief Z轴顺序变更回调（应用层级到图表对象）
    * @return bool - 应用结果：true=成功，false=失败（默认 true，需子类实现具体逻辑）
    */
   virtual bool      OnSetZOrder(void);

   //----------------------------------------------------------------
   // 内部事件处理：资源销毁与属性同步
   //----------------------------------------------------------------
   /**
    * @brief 销毁事件回调（删除图表对象）
    * @return bool - 销毁结果：true=成功（调用 ObjectDelete() 删除对象），false=失败
    */
   virtual bool      OnDestroy(void);

   /**
    * @brief 属性同步回调（统一应用所有样式属性）
    * @return bool - 同步结果：true=所有样式均应用成功，false=至少一项失败
    * @note 依次调用 OnSetText()、OnSetFont() 等所有样式回调，确保属性一致
    */
   virtual bool      OnChange(void);
  };
//+------------------------------------------------------------------+